package com.xhj.mybatis.reflection.wrapper;

import com.xhj.mybatis.reflection.MetaObject;
import com.xhj.mybatis.reflection.factory.ObjectFactory;
import com.xhj.mybatis.reflection.property.PropertyTokenizer;

import java.util.Collection;
import java.util.List;

/**
 * CollectionWrapper
 *
 * @author XJks
 * @description CollectionWrapper 类实现了 ObjectWrapper 接口，用于对集合类型对象（如 List、Set）进行包装和操作。该类主要用于 MyBatis 框架内部，简化集合对象的统一处理。
 */
public class CollectionWrapper implements ObjectWrapper {

    /**
     * 被包装的集合对象，存储实际的数据元素
     */
    private final Collection<Object> object;

    /**
     * 构造方法，初始化 CollectionWrapper 实例
     *
     * @param metaObject 关联的 MetaObject（元对象），但本类未使用
     * @param object     需要包装的集合对象
     */
    public CollectionWrapper(MetaObject metaObject, Collection<Object> object) {
        this.object = object;
    }

    /**
     * 获取属性值的方法。对于集合类型，不支持通过属性名获取元素，直接抛出异常。
     *
     * @param prop 属性分词器
     * @return 无返回值，始终抛出异常
     */
    @Override
    public Object get(PropertyTokenizer prop) {
        throw new UnsupportedOperationException();
    }

    /**
     * 设置属性值的方法。对于集合类型，不支持通过属性名设置元素，直接抛出异常。
     *
     * @param prop  属性分词器
     * @param value 要设置的值
     */
    @Override
    public void set(PropertyTokenizer prop, Object value) {
        throw new UnsupportedOperationException();
    }

    /**
     * 查找属性名的方法。集合类型不支持属性查找，直接抛出异常。
     *
     * @param name                属性名
     * @param useCamelCaseMapping 是否使用驼峰命名映射
     * @return 无返回值，始终抛出异常
     */
    @Override
    public String findProperty(String name, boolean useCamelCaseMapping) {
        throw new UnsupportedOperationException();
    }

    /**
     * 获取所有 getter 方法名。集合类型不支持，直接抛出异常。
     *
     * @return 无返回值，始终抛出异常
     */
    @Override
    public String[] getGetterNames() {
        throw new UnsupportedOperationException();
    }

    /**
     * 获取所有 setter 方法名。集合类型不支持，直接抛出异常。
     *
     * @return 无返回值，始终抛出异常
     */
    @Override
    public String[] getSetterNames() {
        throw new UnsupportedOperationException();
    }

    /**
     * 获取指定属性的 setter 类型。集合类型不支持，直接抛出异常。
     *
     * @param name 属性名
     * @return 无返回值，始终抛出异常
     */
    @Override
    public Class<?> getSetterType(String name) {
        throw new UnsupportedOperationException();
    }

    /**
     * 获取指定属性的 getter 类型。集合类型不支持，直接抛出异常。
     *
     * @param name 属性名
     * @return 无返回值，始终抛出异常
     */
    @Override
    public Class<?> getGetterType(String name) {
        throw new UnsupportedOperationException();
    }

    /**
     * 判断是否有指定属性的 setter 方法。集合类型不支持，直接抛出异常。
     *
     * @param name 属性名
     * @return 无返回值，始终抛出异常
     */
    @Override
    public boolean hasSetter(String name) {
        throw new UnsupportedOperationException();
    }

    /**
     * 判断是否有指定属性的 getter 方法。集合类型不支持，直接抛出异常。
     *
     * @param name 属性名
     * @return 无返回值，始终抛出异常
     */
    @Override
    public boolean hasGetter(String name) {
        throw new UnsupportedOperationException();
    }

    /**
     * 实例化属性值。集合类型不支持，直接抛出异常。
     *
     * @param name          属性名
     * @param prop          属性分词器
     * @param objectFactory 对象工厂
     * @return 无返回值，始终抛出异常
     */
    @Override
    public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) {
        throw new UnsupportedOperationException();
    }

    /**
     * 判断当前对象是否为集合类型。此处始终返回 true。
     *
     * @return true，表示是集合类型
     */
    @Override
    public boolean isCollection() {
        return true;
    }

    /**
     * 向集合中添加一个元素
     *
     * @param element 要添加的元素
     */
    @Override
    public void add(Object element) {
        object.add(element);
    }

    /**
     * 向集合中添加多个元素
     *
     * @param element 要添加的元素列表
     * @param <E>     元素类型
     */
    @Override
    public <E> void addAll(List<E> element) {
        object.addAll(element);
    }

}
